package com.fyl.leetcode.doublePointer;

import java.util.Arrays;
import java.util.HashSet;

/**
 * @author:fyl
 * @date 2021/4/24 15:44
 * @Modified By:
 * @Modified Date:
 * @Description: 编写一个函数，以字符串作为输入，反转该字符串中的元音字母。
 * 示例
 * 输入："hello"
 * 输出："holle"
 * 使用双指针，一个指针从头向尾遍历，一个指针从尾到头遍历，当两个指针都遍历到元音字符时，交换这两个元音字符。
 *
 * 为了快速判断一个字符是不是元音字符，我们将全部元音字符添加到集合 HashSet 中，从而以 O(1) 的时间复杂度进行该操作。
 *
 * 时间复杂度为 O(N)：只需要遍历所有元素一次
 * 空间复杂度 O(1)：只需要使用两个额外变量
 */
public class reverseString {
    private static final HashSet<Character> vowel = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'));

    public String reverseVowels(String s) {
        if (s == null) return null;
        char[] chars = s.toCharArray();
        int i = 0;
        int j = s.length() - 1;
        while (i<j) {
            if (vowel.contains(chars[i]) && vowel.contains(chars[j])) {
               char temp = chars[i];
               chars[i] = chars[j];
               chars[j] = temp;
               i++;
               j--;
            }
            if (!vowel.contains(chars[i])) {
                i++;
            }
            if (!vowel.contains(chars[j])) {
                j--;
            }
        }
        return new String(chars);
    }
}
